<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>

    // let obj = {
    //   name: 11,
    //   age: 22
    // }
    // Object.keys(obj).forEach(key => {
    //   let value = obj[key]
    //   Object.defineProperty(obj, key, {
    //     get() {
    //       console.log("获取");
    //       return value
    //     },
    //     set(newVal) {
    //       console.log('修改了');
    //       value = newVal
    //     }
    //   })
    // })

    // function deepClone(target, map = new Map()) {
    //   // 基本数据类型直接返回
    //   if (typeof target !== 'object') {
    //     return target
    //   }
    //   // 引用数据类型特殊处理
    //   // 判断数组还是对象
    //   const temp = Array.isArray(target) ? [] : {}
    //   if (map.get(target)) {
    //     // 已存在则直接返回
    //     return map.get(target)
    //   }
    //   // 不存在则第一次设置
    //   map.set(target, temp)
    //   for (const key in target) {
    //     // 递归
    //     temp[key] = deepClone(target[key], map)
    //   }
    //   return temp
    // }
    // const a = {
    //   name: 'sunshine_lin',
    //   age: 23,
    //   hobbies: { sports: '篮球', tv: '雍正王朝' },
    //   works: ['2020', '2021']
    // }
    // a.key = a // 环引用
    // const b = deepClone(a)
    // console.log(b);
    // console.log(b)
    // console.log(b === a) // false


    // 原型链其实很好解释
    // 1.实例 构造函数 prototype属性 还有__proto__
    // 实例的__proto__为原型
    // 实例的构造函数的prototype属性也为原型, 它两之间是相等的也是同一个属性

    // 通过instaceof这个方法的原理实现中可以得知
    // [] instaceof Array
    // 实例的__proto__一直寻找如果找到匹配的Array.prototype原型的话,就是相等的
    // 找到最顶端为null的话,就说明找不到也就是返回了false


    // function instaceof(left, right) {
    //   let l1 = left.__proto__
    //   let r1 = right.prototype
    //   while (true) {
    //     if (l1 == r1) return true
    //     l1 = l1.__proto__
    //     if (l1 == null) return false
    //   }
    // }
    // console.log(instaceof([], String));


    // function new1(fn) {
    //   let obj = Object.create(fn.prototype);
    //   let res = fn.apply(obj, [...arguments].slice(1))
    //   if (typeof res === "object") {
    //     return res;
    //   } else {
    //     return obj
    //   }
    // }
    // function fn() {

    // }
    // let a = new1(fn, 1, 2, 3)
    // console.log(a);
    // const d = {};
    // let ary = ['赵', '钱', '孙', '孙', '李', '周', '李', '周', '周', '李'];
    // ary.forEach(item => {
    //   !d[item] ? d[item] = 1 : d[item]++
    // })
    // console.log(Object.keys(d).sort((a, b) => {
    //   return d[b] - d[a]
    // }).filter((item, idx, selt) => {
    //   return d[item] == d[selt[0]]
    // }))





  </script>
</body>

</html>